package com.gxa.admin.recycling.service.impl;

import com.gxa.admin.recycling.mapper.MenuMapper;
import com.gxa.admin.recycling.service.MenuService;
import com.gxa.core.recycling.pojo.Menu;
import com.gxa.core.recycling.service.impl.BaseServiceImpl;
import jdk.nashorn.internal.runtime.linker.LinkerCallSite;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author R
 * @data 2021-12-02 10:00
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements MenuService {

    @Autowired
    MenuMapper mapper;

    /**
     * 最后要返回的集合，里面包含权限树
     */
    private List<Menu> highMenu = null;

    /**
     * 所有的权限，但是没有层级关系
     */
    private List<Menu> allMenus = null;

    /**
     * 获得分配好的权限树
     * @return 返回权限树
     */
    @Override
    public List<Menu> getAllMenus(){
        // 得到数据库的所有权限
        allMenus = mapper.selectAll();
        // 实例化
        highMenu = new ArrayList<>();
        for (Menu menu : allMenus) {
            if (menu.getPid() == 0){
                // 获得所有一级权限
                highMenu.add(menu);
            }
        }
        // 递归操作
        addSonMenus(highMenu);
        return highMenu;
    }

    public void addSonMenus(List<Menu> menus){
        for (Menu menu : menus) {
            // 获得menus集合的下级菜单
            for (Menu sonMenu : allMenus) {
                if (menu.getId() == sonMenu.getPid()){
                    // 添加
                    menu.getMenus().add(sonMenu);
                }
            }
            // 添加下级菜单的在下一级菜单
            addSonMenus(menu.getMenus());
        }
    }

    @Override
    public List<Menu> login(Long id) {
        allMenus = mapper.login(id);
        highMenu = new ArrayList<>();
        for (Menu menu : allMenus) {
            if (menu.getPid() == 0){
                // 获得所有一级权限
                highMenu.add(menu);
            }
        }
        // 递归操作
        addSonMenus(highMenu);
        return highMenu;
    }

}
